package jp.ddo.trismegistos.service.impl;

import java.io.File;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;

import jp.ddo.trismegistos.RsStatics;
import jp.ddo.trismegistos.dao.DaoManager;
import jp.ddo.trismegistos.dao.impl.SqlExecutor;
import jp.ddo.trismegistos.service.DbInitializeService;
import jp.ddo.trismegistos.util.ListFileReader;
import jp.ddo.trismegistos.util.SqlFileReader;

/**
 * DBの初期化を行うクラス。
 * 
 * @author Nagai Satoshi
 */
public class H2DbInitializeServiceImpl implements DbInitializeService {

	/**
	 * {@inheritDoc}
	 * 
	 * @see jp.ddo.trismegistos.service.DbInitializeService#initialize(javax.servlet.ServletContext)
	 */
	@Override
	public void initialize(final ServletContext context) {
		final Map<String, String> master = getMaster(context);
		final String sqlFileDirPath = context.getRealPath(master
				.get(RsStatics.SQL_FILE_DIR_PATH))
				+ File.separator
				+ "create"
				+ File.separator;
		final String encoding = master.get(RsStatics.ENCODING);
		final SqlExecutor sqlExecutor = new SqlExecutor(
				(DaoManager) context.getAttribute(RsStatics.DAO_MANAGER));
		final List<String> tables = ListFileReader
				.read(context.getRealPath("/WEB-INF/conf/databaseinit.lst"),
						encoding);
		for (final String table : tables) {
			final String sql = SqlFileReader.read(sqlFileDirPath + table
					+ ".sql", encoding);
			sqlExecutor.execute(sql);
		}
	}

	/**
	 * コンテキストからマスタ情報を取得して返します。
	 * 
	 * @param context
	 *            コンテキスト
	 * @return マスタ情報
	 */
	@SuppressWarnings("unchecked")
	private Map<String, String> getMaster(final ServletContext context) {
		return (Map<String, String>) context.getAttribute(RsStatics.MASTER);
	}
}
